[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
この記事では、Scala 2系から3系への移行をスムーズに行うために用意された各種オプションについて解説します。
移行状態を管理する2つのオプション指定方法
Scala 3系には、2系からのバージョン移行をスムーズで確実に行うためのオプションがいくつも用意されています。
Scala 3.0では、以下の2つのシーンにおいて4つの状態を使用することができます。
まずは2種類の使用シーンについて見てみましょう。
オプションの種類 | 使用するシーン |
---|---|
コンパイラオプション | ソース全体にオプションを適用したい場合 |
インポートオプション | ファイル毎にオプションを個別指定したい場合 |
コンパイラオプションだけでなく、インポートオプションも用意されているのがポイントです。
コンパイラオプションでソース全体の移行状態を管理しつつ、インポートオプションによってファイルごとに各個撃破、あるいはこのファイルは先送りなどといった判断をすることができます。
移行状態を示す4種のオプション
次に4種類のオプションについて見てみましょう。
オプション | 使用する場面 |
---|---|
3.0-migration | 2.13から3.0への移行準備の開始 |
3.0 | 2.13から3.0への移行の完了 |
3.1-migration | 3.0から3.1への移行準備の開始 |
3.1 | 3.0から3.1への移行の完了 |
これはつまり、2系から3.1までの移行作業がサポートされているということです。
3.0-migration
や3.0
は、2系からのバージョン移行を段階的に行えるようになるので大変便利です。
3.0-migration
は、3.0への移行中である状態を示すオプションです。
3.0-migration
を指定すると、上述の「3系の新しい記法を使用する必要があり、2系の古い記法は使用できない」という制限が緩和され、2系の記法も使用できるようになります。
3.0-migration
を使用することにより、2系から3系への移行作業がしやすくなります。
3.0
は、Scala 3.0においてデフォルトで指定されているオプションです。
これにより使用できる記法が原則としてScala 3系の記法に限定されます。
3.0
を使用することにより、コンパイルが通っている限り、そのソースファイルが2系から確実に脱出できたことを確認することができます。
また、3.1-migration
や3.0
は、3.1以降へ先行的に対応したい場合に、これを担保できるので非常に便利です。
3.1-migration
を指定すると、「2系の記法の一部が使用できる」という移行措置を活用している箇所に対して、警告などの情報が表示され、3.1への移行を行うべき箇所が明らかとなります。
3.1-migration
を使用することにより、3.0から3.1への移行作業がしやすくなります。
3.1
を指定すると、2系の記法が完全に使用できなくなります。
3.1
を使用することにより、コンパイルが通っている限り、そのソースファイルが3系へと確実に移行できたことを確認することができます。
コンパイラオプションの指定方法
コンパイラオプションは、-source
オプションを使用し、-source 3.0-migration
といった形式でコマンドライン引数に設定します。
build.sbt で指定する場合には、以下のように変数scalacOptions
に追加します。
build.sbtscalacOptions += "-source 3.0-migration"
インポートオプションの指定方法
4つのインポートオプションはscala.language
パッケージに定義されているので、これをそれぞれの箇所でインポートして使用しましょう。
インポートオプションには重要な性質が3つあります。
まず、インポートオプションはコンパイラオプションを上書きします。
全体の管理にはコンパイラオプションを使用し、個別の管理にインポートオプションを使用するようにしましょう。
また、1つのコンパイル単位ごとに1つのインポートオプションのみ指定可能です。
複数指定したり、あるいは特定のスコープのみ指定したりということはできません。
そして、インポートオプションはコンパイル単位の冒頭にて宣言される必要があります。
ファイルの途中で突然宣言されるとコンパイルエラーとなります。
具体的には、以下のようにパッケージ宣言直後に宣言するのがよいでしょう。
package com.sample import scala.language.`3.1-migration` object Main extends App { ... }